package ar.com.muebleria.model.dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import org.apache.log4j.Logger;

import ar.com.muebleria.beans.Producto;
import ar.com.muebleria.model.Conector;

public class DAOProducto {
	private Connection connection;
	public DAOProducto(){
		Conector conector = Conector.getInstance();
		connection = conector.getConnection();
	}

	public void close(){
		try {
			connection.close();
		} catch (SQLException e) {
			Logger.getLogger("DAOProducto").error(e);
		}
	}
	public String obtenerDescripcionProducto(String familia, String subFamilia){
		String out = "ERROR!";
		
		String sqlSelect = "SELECT DESCRIPCION " +
				           "  FROM sub_familia  " + 
				           " WHERE id_familia =  " + familia + 
				           "   AND id_sub_familia = " + subFamilia +
				           " ; ";
	
		Statement sentencia = null;
		try {
			Logger.getLogger("DAOProducto").info("Creando el statement.");
			sentencia = connection.createStatement();
		} catch (SQLException e) {
			Logger.getLogger("DAOProducto").error("Error al crear el Statemnet",e);
		}
		ResultSet rs = null;
		try {
			Logger.getLogger("DAOProducto").info("Creando resultSet de consulta.");
			Logger.getLogger("DAOProducto").info("Se ejecutara " + sqlSelect);
			rs = sentencia.executeQuery( sqlSelect );
		} catch (SQLException e) {
			Logger.getLogger("DAOProducto").error("Error en la ejecucion del query. " + sqlSelect,e);
		}
		try {
			if (rs.next()) {
				out = rs.getString("DESCRIPCION");
				Logger.getLogger("DAOProducto").info("Se obtubo la descripcion: " + out);
//				DESCRIPCION
			}
		} catch (SQLException e) {
			Logger.getLogger("DAOProducto").error("Error al obtener los valores.",e);
		}finally{
			try {
				rs.close();
				sentencia.close();
			} catch (SQLException e) {
				Logger.getLogger("DAOProducto").error("No se cerro el Statement. ",e);

			}
		}
		
		return out;
	}

	public int descargarProducto(Producto producto) {
		int out = 0;
		
		String sqlSelect = "UPDATE producto " +
				           "   SET EN_STOCK = 'N'," +
				           "       FECHA_SALIDA = DATETIME()  " + 
				           " WHERE id_familia =  " + producto.getSubFamilia().getFamilia().getFamliaId() + 
				           "   AND id_sub_familia = " + producto.getSubFamilia().getSubFamiliaId() +
				           "   AND id_producto = " + producto.getProductoId() +
				           "   AND (en_stock = 'S' OR en_stock is null)  ; ";
	
		Statement sentencia = null;
		try {
			Logger.getLogger("DAOProducto").info("Creando el statement.");
			sentencia = connection.createStatement();
		} catch (SQLException e) {
			Logger.getLogger("DAOProducto").error("Error al crear el Statemnet",e);
		}
		try {
			Logger.getLogger("DAOProducto").info("Se ejecutara " + sqlSelect);
			out = sentencia.executeUpdate( sqlSelect );
			if(out == 0){
				Logger.getLogger("DAOProducto").error("Error en la ejecucion del query. " + sqlSelect);
				Logger.getLogger("DAOProducto").error("No se modifico ninguna fila. ");
				connection.rollback();
			}else{
				Logger.getLogger("DAOProducto").info("Se descargo el producto: " + producto.codigoCompleto());
				connection.commit();
			}

		} catch (SQLException e) {
			Logger.getLogger("DAOProducto").error("Error en la ejecucion del query. " + sqlSelect,e);
		}finally{
			try {
				sentencia.close();
			} catch (SQLException e) {
				Logger.getLogger("DAOProducto").error("No se cerro el Statement. ",e);

			}
		}
		
		
		return out;
	}

	public int insertarProductos(Producto producto) {
		int out = 0;
	
		Statement sentencia = null;
		try {
			Logger.getLogger("DAOProducto").info("Creando el statement.");
			sentencia = connection.createStatement();
		} catch (SQLException e) {
			Logger.getLogger("DAOProducto").error("Error al crear el Statemnet",e);
		}
		try {
			int idProducto = 0;
			String sqlSelect = "SELECT max(ID_PRODUCTO) id " +
			                   "  FROM PRODUCTO  " + 
			                   " WHERE id_familia =  " + producto.getSubFamilia().getFamilia().getFamliaId() + 
			                   "   AND id_sub_familia = " + producto.getSubFamilia().getSubFamiliaId() +
			                   " ; ";
			
			ResultSet rs = null;
			try {
				Logger.getLogger("DAOProducto").info("Creando resultSet de consulta.");
				Logger.getLogger("DAOProducto").info("Se ejecutara " + sqlSelect);
				rs = sentencia.executeQuery( sqlSelect );
			} catch (SQLException e) {
				Logger.getLogger("DAOProducto").error("Error en la ejecucion del query. " + sqlSelect,e);
			}
			
			if (rs.next()) {
				idProducto = rs.getInt("id");
				Logger.getLogger("DAOProducto").info("Se obtubo el id: " + idProducto);
//					DESCRIPCION
			}
			
			for(int i = 1 ; i <= producto.getCantidadStock() ; i++ ){
				producto.setProductoId(Integer.toString(idProducto+i));
				String sqlSelect1 = "INSERT INTO PRODUCTO (ID_PRODUCTO," +
								   "                      ID_SUB_FAMILIA,"+	
								   "                      ID_FAMILIA,"+
								   "                      EN_STOCK,"+
								   "                      FECHA_ENTRADA)"+
								   "VALUES ("+ producto.getProductoId() +"," +
								   "        "+ producto.getSubFamilia().getSubFamiliaId() + "," +
								   "        "+ producto.getSubFamilia().getFamilia().getFamliaId() + "," +
								   "        'S'," +
								   "        DATETIME());";
				
				Logger.getLogger("DAOProducto").info("Se ejecutara " + sqlSelect1);
				out = sentencia.executeUpdate( sqlSelect1 );
				if(out == 0){
					Logger.getLogger("DAOProducto").error("Error en la ejecucion del query. " + sqlSelect1);
					Logger.getLogger("DAOProducto").error("No se modifico ninguna fila. ");
					connection.rollback();
					return 0;
				}else{
					Logger.getLogger("DAOProducto").info("Se inserto el producto: " + producto.codigoCompleto());
				}
			}
			connection.commit();

		} catch (SQLException e) {
			Logger.getLogger("DAOProducto").error("Error en la ejecucion del query. ",e);
		}finally{
			try {
				sentencia.close();
			} catch (SQLException e) {
				Logger.getLogger("DAOProducto").error("No se cerro el Statement. ",e);

			}
		}
		
		
		return out;
	}
	
}
